package Estats;

import org.newdawn.slick.Font;
import org.newdawn.slick.GameContainer;
import org.newdawn.slick.Graphics;
import org.newdawn.slick.Image;
import org.newdawn.slick.SlickException;
import org.newdawn.slick.Sound;
import org.newdawn.slick.gui.AbstractComponent;
import org.newdawn.slick.gui.ComponentListener;
import org.newdawn.slick.state.BasicGameState;
import org.newdawn.slick.state.StateBasedGame;
import GUI.BotoMenu;
import newMenu.ManagerPerfil;
import newMenu.ManagerRecursos;
//import newMenu.ReproductorMusica;

/**
 * Es mostra informació referent a les puntuacions acumulades per l'usuari del perfil actiu
 * @author David Alvarez Palau i Ernest Daban Macià
 */
public class EstatEstadistiques extends BasicGameState {

    // Identificador del estat
    public static final int ID = 8;
    // Contenidor del joc
    private GameContainer container;
    // Contenidor d'estats que s'usara per accedir als estats necessaris
    private StateBasedGame state;
    // Boto per reinicar la wave
    private BotoMenu botoTornar;
    // Imatge del fons de pantalla
    private Image imatgeFons;
    // Imatge del boto normal (Sense mouse over)
    private Image imatgeBotoNormal;
    // Image del boto amb mouse over
    private Image imatgeBotoOver;
    // So del boto quan es clicat
    private Sound soClick;
    // So del boto quan hi ha mouse over
    private Sound soOver;
    // Font que s'usa per renderitzar el text
    private Font font;
    // Total de morts acumulats pel jugador
    private static int vidas;
    // Total d'unitats col·locades pel jugador
    private static int puntuacio;
    // Total diners acumulats
    private static int muertes;
    // Total aures col·locades
    private static int enemigosAbatidos;
    // Text del boto tornar
    private Image textTornar;
    // Text del boto tornar CAT
    private Image textTornarCat;
    // Text del boto tornar ENG
    private Image textTornarEng;
    // Titol del estat
    private Image titolEstat;
    // Titol del estat CAT
    private Image titolEstatCat;
    // Titol del estat ENG
    private Image titolEstatEng;
    //Iidoma perfil
    private int idioma;

    /**
     * BasicGameState ens obliga a implementar aquest metode
     * @return int amb l'ID de l'estat del joc
     */
    public int getID() {
        return ID;
    }

    /**
     * Aqui s'inicialitzen les variables necessaries per al correcte funcionament del estat
     * @param container
     * @param game
     * @throws SlickException
     */
    public void init(GameContainer container, StateBasedGame game)
            throws SlickException {
        this.state = game;
        this.container = container;
        imatgeFons = ManagerRecursos.getImage("fonsSelectorImage");
        imatgeBotoNormal = ManagerRecursos.getImage("botoPetitOverImage");
        imatgeBotoOver = ManagerRecursos.getImage("botoPetitImage");
        textTornar = ManagerRecursos.getImage("textTornarEspImage");
        textTornarCat = ManagerRecursos.getImage("textTornarCatImage");
        textTornarEng = ManagerRecursos.getImage("textTornarEngImage");
        titolEstat = ManagerRecursos.getImage("titotlEstadistiquesEspImage");
        titolEstatCat = ManagerRecursos.getImage("titotlEstadistiquesCatImage");
        titolEstatEng = ManagerRecursos.getImage("titotlEstadistiquesEngImage");
        soClick = ManagerRecursos.getSound("clickSound");
        soOver = ManagerRecursos.getSound("overSound");
        font = ManagerRecursos.getFont("dejavuNormalFont");

    }

    /**
     * El motor s'encarrega de cridar aquest metode, aqui s'actualitzaran dades de variables o objectes
     * que s'estiguin usant en aquest estat
     * @param container
     * @param game
     * @param delta
     * @throws SlickException
     */
    public void update(GameContainer container, StateBasedGame game, int delta)
            throws SlickException {
        //ReproductorMusica.update(container);
    }

    /**
     * Aquest metode s'usa per renderitzar o dibuixar en pantalla els elements que es vulguin
     * @param container
     * @param game
     * @param g
     * @throws SlickException
     */
    public void render(GameContainer container, StateBasedGame game, Graphics g)
            throws SlickException {
        imatgeFons.draw(0, 0);
        
        botoTornar.render(container, g);
        g.setFont(font);
        if (idioma == 1) {
            titolEstat.draw(250, 130);
            g.drawString("Vidas:" + vidas, 300, 240);
            g.drawString("Muertes en combate:" + muertes, 300, 270);
            g.drawString("Enemigos abatidos:" + enemigosAbatidos, 300, 300);
            g.drawString("Enemigos abatidos - Me163: " + ManagerPerfil.getNavesDestruidas1(), 300, 330);
            g.drawString("Enemigos abatidos - Helicopteros Alemanes: " + ManagerPerfil.getNavesDestruidas2(), 300, 360);
            g.drawString("Enemigos abatidos - Tanques: " + ManagerPerfil.getNavesDestruidas1(), 300, 390);
            g.drawString("Enemigos abatidos - Donier17: " + ManagerPerfil.getNavesDestruidas1(), 300, 420);
            g.drawString("Enemigos abatidos - Caza a reaccion japones: " + ManagerPerfil.getNavesDestruidas1(), 300, 450);
            g.drawString("Puntuacion:" + puntuacio, 300, 480);
        } else if (idioma == 2) {
            titolEstatCat.draw(250, 130);
            g.drawString("Vides:" + vidas, 300, 240);
            g.drawString("Morts en combat: " + muertes, 300, 270);
            g.drawString("Enemics abatuts: " + enemigosAbatidos, 3010, 300);
            g.drawString("Enemics abatuts - Me163: " + ManagerPerfil.getNavesDestruidas1(), 300, 330);
            g.drawString("Enemics abatuts - Helicopter Alemany: " + ManagerPerfil.getNavesDestruidas2(), 300, 360);
            g.drawString("Enemics abatuts - Tanques: " + ManagerPerfil.getNavesDestruidas1(), 300, 390);
            g.drawString("Enemics abatuts - Donier17: " + ManagerPerfil.getNavesDestruidas1(), 300, 420);
            g.drawString("Enemics abatuts - Caça a reacció japones: " + ManagerPerfil.getNavesDestruidas1(), 300, 450);
            g.drawString("Puntuació:" + puntuacio, 300, 480);
        } else if (idioma == 3) {
            titolEstatEng.draw(250, 130);
            g.drawString("Lives: " + vidas, 300, 240);
            g.drawString("Deaths in combat:" + muertes, 300, 270);
            g.drawString("Enemigos abatidos:" + enemigosAbatidos, 300, 300);
            g.drawString("Depressed enemies - Me163: " + ManagerPerfil.getNavesDestruidas1(), 300, 330);
            g.drawString("Depressed enemies - German helicopter: " + ManagerPerfil.getNavesDestruidas2(), 300, 360);
            g.drawString("Depressed enemies - Tanques: " + ManagerPerfil.getNavesDestruidas1(), 300, 390);
            g.drawString("Depressed enemies - Donier17: " + ManagerPerfil.getNavesDestruidas1(), 300, 420);
            g.drawString("Depressed enemies - Japanese hunts to reaction: " + ManagerPerfil.getNavesDestruidas1(), 300, 450);
            g.drawString("Punctuation: " + puntuacio, 300, 480);
        }
    }

    /**
     * Es fa un override del metode enter, el qual es crida cada vegada que s'entra a l'estat
     * @param gc : context on es situa l'estat actual
     * @param state : estat actual
     */
    @Override
    public void enter(GameContainer gc, StateBasedGame state) {
        idioma = ManagerPerfil.getIdioma();
        crearBotonsMenuNormal();
        afegirListeners();
        // Quan s'accedeix a l'estat s'inicialitzen els valors corresponents
        vidas = ManagerPerfil.getVidas();
        muertes = ManagerPerfil.getMuertes();
        enemigosAbatidos = ManagerPerfil.getNavesDestruidas();
        puntuacio = ManagerPerfil.getPuntuacio();
    }

    /**
     * En aquest metode es creen els botons que es mostraran en el menu principal
     * A través del manager de recursos assignem una imatge i una posicio als botons
     */
    private void crearBotonsMenuNormal() {
        // BotoMenu tornar al menu principal
        botoTornar = new BotoMenu(container, imatgeBotoNormal, 400, 570);
        botoTornar.setMouseOverImage(imatgeBotoOver);
        if (idioma == 1) {
            botoTornar.setImageText(textTornar);
        } else if (idioma == 2) {
            botoTornar.setImageText(textTornarCat);
        } else if (idioma == 3) {
            botoTornar.setImageText(textTornarEng);
        }
        botoTornar.setMouseDownSound(soClick);
        botoTornar.setMouseOverSound(soOver);
        botoTornar.setActiu(true);
    }

    /**
     * S'afegeixen els listeners que faran accionar els botons
     */
    private void afegirListeners() {
        botoTornar.addListener(new ComponentListener() {

            public void componentActivated(AbstractComponent comp) {
                state.enterState(EstatMenuPrincipal.ID);
            }
        });
    }
}
